package com.dengtao.controller;

import cn.hutool.core.io.FileUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.dengtao.common.Result;
import com.dengtao.common.R;
import com.dengtao.common.ReceiveData;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * Author:  JiamingZhao
 * Date:  2025/3/3 20:22
 */
@Slf4j
@RequiredArgsConstructor
@RestController
@CrossOrigin
@RequestMapping("/predict")
public class PredictController {

    @PostMapping("/gene")
    public R<List<Result>> getGene(@RequestBody ReceiveData data) {
        String serverUrl = "http://47.122.78.139:5000/predict";

        try {
            // 将字符串保存为临时 TXT 文件
            File tempFile = saveStringToTempFile(data.getData());

            // 调用接口进行预测
            String response = sendFileToServer(tempFile, serverUrl);

            // 打印响应结果
            System.out.println("预测结果: " + response);

            // 删除临时文件
            FileUtil.del(tempFile);
            JSONArray array = JSONUtil.parseArray(response);
            List<Result> geneResults = JSONUtil.toList(array, Result.class);
            return R.success(geneResults);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }


    }


    @PostMapping("/protein")
    public R<List<Result>> getProtein(@RequestBody ReceiveData data) {
        String serverUrl = "http://47.122.78.139:6000/predict";

        try {
            // 将字符串保存为临时 TXT 文件
            File tempFile = saveStringToTempFile(data.getData());

            // 调用接口进行预测
            String response = sendFileToServer(tempFile, serverUrl);

            // 打印响应结果
            System.out.println("蛋白质预测结果: " + response);

            // 删除临时文件
            FileUtil.del(tempFile);
            JSONArray array = JSONUtil.parseArray(response);
            List<Result> geneResults = JSONUtil.toList(array, Result.class);
            return R.success(geneResults);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }


    }


    /**
     * 将字符串保存为临时 TXT 文件
     * @param data 要保存的字符串数据
     * @return 临时文件对象
     * @throws IOException 保存文件时可能抛出的异常
     */
    private static File saveStringToTempFile(String data) throws IOException {
        // 创建临时文件
        File tempFile = File.createTempFile("gene_data", ".txt");
        // 将字符串写入文件
        FileUtil.writeUtf8String(data, tempFile);
        return tempFile;
    }

    /**
     * 发送文件到服务器进行预测
     * @param file 要发送的文件
     * @param url 服务器接口地址
     * @return 服务器响应结果
     */
    private static String sendFileToServer(File file, String url) {
        // 创建 HTTP POST 请求
        HttpRequest request = HttpUtil.createPost(url);
        // 添加文件参数
        request.form("file", file);
        // 发送请求并获取响应
        HttpResponse response = request.execute();
        return response.body();
    }

}
